package in.lib.adapter;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import in.data.entity.HashEntity;
import in.model.AdnModel;
import in.model.SimpleUser;
import in.view.delegate.AutoCompleteHashDelegate;
import in.view.delegate.AutoCompleteUserDelegate;
import in.view.delegate.base.AdapterDelegate;
import lombok.Getter;
public class AutoCompleteAdapter extends BaseAdapter implements Filterable
{
@Getter private final Context context;
@Getter private final List<? extends AdnModel> items;
@Getter private List<? extends AdnModel> originalItems;
@Getter private SparseArray<AdapterDelegate<?>> itemTypes = new SparseArray<AdapterDelegate<?>>();
private String typedConstraint = "";
private static final int TYPE_USERNAMES = 0;
private static final int TYPE_HASHTAGS = 1;
public AutoCompleteAdapter(Context context, List<? extends AdnModel> items)
{
this.context = context;
this.items = items;
this.originalItems = new ArrayList<AdnModel>(items);
itemTypes.put(TYPE_USERNAMES, new AutoCompleteUserDelegate(null));
itemTypes.put(TYPE_HASHTAGS, new AutoCompleteHashDelegate(null));
}
public void setItems(Collection users)
{
this.items.clear();
this.items.addAll(users);
this.originalItems = new ArrayList<AdnModel>(items);
}
@Override public int getCount()
{
return items.size();
}
@Override public AdnModel getItem(int position)
{
return items.get(position);
}
@Override public long getItemId(int position)
{
return items.get(position).hashCode();
}
@Override public int getViewTypeCount()
{
return itemTypes.size();
}
@Override public int getItemViewType(int position)
{
AdnModel item = getItem(position);
if (item instanceof SimpleUser)
{
return TYPE_USERNAMES;
}
else if (item instanceof HashEntity)
{
return TYPE_HASHTAGS;
}
return -1;
}
@Override public View getView(int position, View convertView, ViewGroup parent)
{
int viewType = getItemViewType(position);
AdnModel item = getItem(position);
convertView = ((AdapterDelegate)getItemTypes().get(viewType)).getView(item, position, convertView, parent, LayoutInflater.from(getContext()));
return convertView;
}
@Override public Filter getFilter()
{
Filter myFilter = new Filter()
{
@Override protected FilterResults performFiltering(CharSequence constraint)
{
FilterResults filterResults = new FilterResults();
if (constraint != null)
{
typedConstraint = constraint.toString().toLowerCase();
List<AdnModel> items = new ArrayList<AdnModel>();
for (AdnModel item : originalItems)
{
if (item instanceof SimpleUser)
{
String testUsername = String.format("@%s", ((SimpleUser)item).getUsername()).toLowerCase();
String testName = String.format("@%s", ((SimpleUser)item).getFullname()).toLowerCase();
if (testUsername.startsWith(typedConstraint)
|| testName.startsWith(typedConstraint))
{
items.add(item);
}
}
else if (item instanceof HashEntity)
{
String testHash = String.format("#%s", ((HashEntity)item).getName()).toLowerCase();
if (testHash.startsWith(typedConstraint))
{
items.add(item);
}
}
}
Collections.sort(items, new Comparator<AdnModel>()
{
@Override public int compare(AdnModel lhs, AdnModel rhs)
{
if (lhs instanceof SimpleUser && rhs instanceof SimpleUser)
{
String lhsUsername = String.format("@%s", ((SimpleUser)lhs).getUsername());
String rhsUsername = String.format("@%s", ((SimpleUser)rhs).getUsername());
if (lhsUsername.indexOf(typedConstraint) < rhsUsername.indexOf(typedConstraint))
{
return 1;
}
else if (lhsUsername.indexOf(typedConstraint) > rhsUsername.indexOf(typedConstraint))
{
return -1;
}
else
{
return 0;
}
}
else if (lhs instanceof HashEntity && rhs instanceof HashEntity)
{
String lhsTag = String.format("#%s", ((HashEntity)lhs).getName());
String rhsTag = String.format("#%s", ((HashEntity)rhs).getName());
if (lhsTag.indexOf(typedConstraint) < rhsTag.indexOf(typedConstraint))
{
return 1;
}
else if (lhsTag.indexOf(typedConstraint) > rhsTag.indexOf(typedConstraint))
{
return -1;
}
else
{
return 0;
}
}
return 0;
}
});
// Now assign the values and count to the FilterResults
// object
filterResults.values = items;
filterResults.count = items.size();
}
return filterResults;
}
@Override protected void publishResults(CharSequence contraint, FilterResults results)
{
if (results != null && results.count > 0)
{
getItems().clear();
getItems().addAll((Collection)results.values);
notifyDataSetChanged();
}
}
};
return myFilter;
}
}